#!/usr/bin/env python3

import os
import sys
import telnetlib

import common

prompt = b'\n(qemu) '

parser = common.get_argparse({
    'description': '''\
Run a command on the QEMU monitor of a running QEMU instance

If the stdin is a terminal, open an interact shell. Otherwise,
run commands from stdin and quit.
'''
})
parser.add_argument(
    'command',
    help='If given, run this command and quit',
    nargs='*',
)
args = common.setup(parser)

def write_and_read(tn, cmd, prompt):
    tn.write(cmd.encode('utf-8'))
    return '\n'.join(tn.read_until(prompt).decode('utf-8').splitlines()[1:])[:-len(prompt)]

with telnetlib.Telnet('localhost', common.qemu_monitor_port) as tn:
    # Couldn't disable server echo, so just removing the write for now.
    # https://stackoverflow.com/questions/12421799/how-to-disable-telnet-echo-in-python-telnetlib
    # sock = tn.get_socket()
    # sock.send(telnetlib.IAC + telnetlib.WILL + telnetlib.ECHO)
    if os.isatty(sys.stdin.fileno()):
        if args.command == []:
            print(tn.read_until(prompt).decode('utf-8'), end='')
            tn.interact()
        else:
            tn.read_until(prompt)
            print(write_and_read(tn, ' '.join(args.command) + '\n', prompt))
    else:
        tn.read_until(prompt)
        print(write_and_read(tn, sys.stdin.read() + '\n', prompt))
